package com.houhanzhi.manager.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.houhanzhi.manager.ProductOrderManager;
import com.houhanzhi.mapper.ProductOrderMapper;
import com.houhanzhi.model.ProductOrderDO;
import com.houhanzhi.vo.ProductOrderVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

@Repository
public class ProductOrderManagerImpl implements ProductOrderManager {

    @Autowired
    private ProductOrderMapper productOrderMapper;

    /**
     * 新增
     *
     * @param productOrderDO
     * @return
     */
    @Override
    public int add(ProductOrderDO productOrderDO) {
        return productOrderMapper.insert(productOrderDO);
    }

    /**
     * 根据订单号和账号查询订单
     *
     * @param outTradeNo
     * @param accountNo
     * @return
     */
    @Override
    public ProductOrderDO findByOutTradeNoAndAccountNo(String outTradeNo, long accountNo) {
        return productOrderMapper.selectOne(new QueryWrapper<ProductOrderDO>()
                .eq("out_trade_no", outTradeNo)
                .eq("account_no", accountNo)
                .eq("del", 0)
        );
    }

    /**
     * 更新订单状态
     *
     * @param outTradeNo
     * @param accountNo
     * @param newState
     * @param oldState
     * @return
     */
    @Override
    public int updateOrderPayState(String outTradeNo, long accountNo, String newState, String oldState) {
        return productOrderMapper.update(null, new UpdateWrapper<ProductOrderDO>()
                .eq("out_trade_no", outTradeNo)
                .eq("account_no", accountNo)
                .eq("state", oldState)
                .set("state", newState)
        );
    }

    /**
     * 分页查询
     *
     * @param page
     * @param size
     * @param accountNo
     * @param state
     * @return
     */
    @Override
    public Map<String, Object> page(int page, int size, long accountNo, String state) {
        Page<ProductOrderDO> pageInfo = new Page<>(page, size);
        IPage<ProductOrderDO> productOrderDOPage = new Page<>();
        if (StringUtils.isNotBlank(state)) {
            productOrderDOPage = productOrderMapper.selectPage(pageInfo, new QueryWrapper<ProductOrderDO>()
                    .eq("account_no", accountNo)
                    .eq("state", state)
                    .eq("del", 0)
                    .orderByDesc("gmt_create")
            );
        } else {
            productOrderDOPage = productOrderMapper.selectPage(pageInfo, new QueryWrapper<ProductOrderDO>()
                    .eq("account_no", accountNo)
                    .eq("del", 0)
                    .orderByDesc("gmt_create")
            );
        }
        final Map<String, Object> pageMap = new HashMap<>(3);
        pageMap.put("total_record", productOrderDOPage.getTotal());
        pageMap.put("total_page", productOrderDOPage.getPages());
        pageMap.put("current_data", productOrderDOPage.getRecords().stream()
                .map(this::beanProcess)
                .collect(Collectors.toList()));
        return pageMap;
    }

    /**
     * 删除
     * @param productOrderId
     * @param accountNo
     * @return
     */
    @Override
    public int del(long productOrderId, long accountNo) {
        return productOrderMapper.update(null, new UpdateWrapper<ProductOrderDO>()
                .eq("id", productOrderId)
                .eq("account_no", accountNo)
                .set("del", 1)
        );
    }

    private ProductOrderVO beanProcess(ProductOrderDO productOrderDO) {
        final ProductOrderVO productOrderVO = new ProductOrderVO();
        BeanUtils.copyProperties(productOrderDO, productOrderVO);
        return productOrderVO;
    }
}
